<?php
/**
 * 11、设计模式学习-组合模式
 * 公司调用总部部门与分部部门控制器
 * 2019年12月15日16:30:10
 */
namespace Application\Controller;

use Application\Common\Composite\NoUseComposite\Branch as BranchNoUseComposite;
use Application\Common\Composite\NoUseComposite\Leaf as LeafNoUseComposite;
use Application\Common\Composite\useComposite\Branch as BranchUseComposite;
use Application\Common\Composite\UseComposite\Finance as FinanceUseComposite;
use Application\Common\Composite\UseComposite\Hr as HrUseComposite;

class CompanyCompositeController extends BaseController
{
    // 没有使用组合模式，调用一个部门与一次调用多个部门
    public function noUseComposite()
    {
        // 调用一个部门
        echo '调用一个部门：<br>';
        $finance = new LeafNoUseComposite('财务部');
        $finance -> display();
        // 或
        // $branch = new BranchNoUseComposite();
        // $branch -> add($finance);
        // $branch -> display();

        echo '<hr />';
        echo '一次调用多个部门：<br />';
        $hr = new LeafNoUseComposite('人力资源部');
        $branch = new BranchNoUseComposite();
        $branch -> add($finance);
        $branch -> add($hr);
        // 调用多个部门
        $branch -> display();
        // 总结：简单代码可以实现 [调用单个对象与调用组合一起的多个对象具有一致性]；但不是太明确的树形结构，如果对象具有树形化特性，则此代码虽然可以实现树形化调用但不能很好的表示这种树形化特性
        // 总结：此代码可以看做是简单的组合模式
    }
    // 使用组合模式，调用一个部门与一次调用多个部门
    public function useComposite()
    {
        // 调用一个部门
        $finance = new FinanceUseComposite('财务部');
        $finance -> display();

        // 调用多个部门
        echo '<hr />';
        // 定义总部
        $root = new BranchUseComposite('公司总部');
        // 定义分部
        $beijing = new BranchUseComposite('公司分部-北京分部');
        $nanjing = new BranchUseComposite('公司分部-南京分部');
        // 定义部门
        $root_finance = new FinanceUseComposite('总部财务部');
        $root_hr = new HrUseComposite('总部人力资源部');
        $beijing_finance = new FinanceUseComposite('北京分部-财务部');
        $beijing_hr = new HrUseComposite('北京分部-人力资源部');
        $nanjing_finance = new FinanceUseComposite('南京分部-财务部');
        $nanjing_hr = new HrUseComposite('南京分部-人力资源部');
        // 添加部门
        $root -> add($root_finance);
        $beijing -> add($beijing_finance);
        $nanjing -> add($nanjing_finance);
        $nanjing -> add($nanjing_hr);
        $beijing -> add($beijing_hr);
        $root -> add($beijing);
        $root -> add($nanjing);
        $root -> add($root_hr);
        // 删除节点
        // $root -> remove($root_finance);
        // 调用
        $root -> display();
        // 总结：树形化接口明显，节点增加方便
    }
}
